import Vue from 'vue'
import Router from 'vue-router'
import { constantRouterMap, asyncRouterMap, constUrl } from './routes'
import { Notification } from 'element-ui'
import { getMenuByRouter } from './util'
import store from '@/store'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'

NProgress.configure({ showSpinner: false })

Vue.use(Router)
const router = new Router({
  routes: constantRouterMap,
  // routes: constUrl,
  mode: 'hash'
})

const LOGIN_PAGE_NAME = 'login'

function hasOneOf(target, arr) {
  target.some(function find(x1) {
    return x1 == arr
  })
  // return target.some(_ => arr.indexOf(_) > -1)
}

function hasAccess(role, route) {
  if (route.meta && route.meta.roles) {
    return hasOneOf(role, route.meta.roles)
  }
  return true
}

function canTurnTo(name, role, routes) {
  const routePermissionJudge = (list) => {
    return list.some(item => {
      if (item.children && item.children.length
      ) {
        return routePermissionJudge(item.children)
      } else
      if (item.name === name) {
        return hasAccess(role, item)
      }
    })
  }
  return routePermissionJudge(routes)
}

// 以下所有为一个函数
// 检查用户是否登录，登录后会有token值，这样可以防止用户在输入栏直接输入path进入后台
// 或者其他没有权限的页面
// to:将要去往的下一个页面
// from：从哪个页面过来
// next:是否运行
router.beforeEach((to, from, next) => {
  NProgress.start()
  const token = getToken()
  // 未登录且要跳转的页面不是登录页，则跳转到登录页
  if (!token && to.name !== LOGIN_PAGE_NAME) {
    console.log('1')
    next({
      name: LOGIN_PAGE_NAME
    })
  } else if (!token && to.name === LOGIN_PAGE_NAME) {
    console.log('2')
    // 未登陆且要跳转的页面是登录页
    // 获取路由列表
    next()
  } else if (token && to.name === LOGIN_PAGE_NAME) {
    console.log('3')
    next({
      name: 'welcome'
    })
  } else {
    // 该种情况是token存在，且跳转的页面不是login页面
    const userInfo = store.state.user.userInfo
    // 当以上的操作可以获取用户信息时，则执行next，当用户信息不存在时，则需要调用下面的if获取信息
    if (!userInfo) {
      store.dispatch('getUserInfo').then(res => {
        // 成功返回正确的用户信息时，
        if (res.code === 1) {
          if (true) {
            const { roles } = store.getters
            const routes = getMenuByRouter(asyncRouterMap, roles)
            store.commit('ADD_MENUS', routes)
            router.addRoutes(routes)
            next({
              ...to, replace: true
            })
          } else {
          }
        } else {
          // 拉取用户信息业务码不等于1
          Notification({
            title: '警告',
            message: res.msg,
            type: 'error'
          })
          setTimeout(() => {
            store.dispatch('LogOut')
              .then(() => {
                next({
                  name: LOGIN_PAGE_NAME
                })
              })
          }, 2000)
        }
      })
        .catch(err => {
          store.dispatch('LogOut')
            .then(() => {
              next({
                name: LOGIN_PAGE_NAME
              })
            })
        })
    } else {
      // 当用户信息存在，则直接进入to界面
      next()
    }
  }
  NProgress.done()
})

router.afterEach(() => {
  NProgress.done()
})

export default router
